package Radar;
import java.io.Serializable;
import Misil.Misil;

/**
 * @brief Clase Detectado. Esta clase es para almacenar datos sobre los misiles detectados.
 * 		  Se requieren dos posiciones y dos marcas de tiempo para determinar la velocidad 
 * 		  de un misilEnemigo, por lo cual, se utiliza esta clase para encapsular el misil
 * 		  enemigo detectado y almacenar esos datos.

 * @author Marcelo
 * @version 1.0
 * @created 17-jul-2012 09:08:13 p.m.
 */
public class Detectado implements Serializable{
	//Campos de la clase Detectado
	private int marcaTiempo1;
	private int marcaTiempo2;
	private double[] posicionTiempo1;
	private double[] posicionTiempo2=new double[3];
	private Misil misilDetectado;
	private int velocidadCalculada;

	/**
	 * @brief Constructor predeterminado.
	 */
	public Detectado(){}
	
	
	/**
	 * @brief Constructor Alternativo con un Misil que ya posee una primera marca de tiempo.
	 * @param misil
	 * @param tiempo1
	 */
	public Detectado(Misil misil,int tiempo1){
		misilDetectado=misil;
		posicionTiempo1=misil.getPosition();
		posicionTiempo2=new double[3];
		marcaTiempo1=tiempo1;
		marcaTiempo2=0;
		velocidadCalculada=0;
	}
	
	
	/**
	 * @brief Metodo que Asigna la segunda marca de tiempo correspondiente.
	 * 		  Las marcas de tiempo s toman en cada deteccion.
	 * @param tiempo2
	 * @param posicion2
	 */
	public void setMarcaTiempo2(int tiempo2,double[] posicion2){
		marcaTiempo2=tiempo2;
		posicionTiempo2=posicion2;
		calcularVelocidad();
	}

	
	/**
	 * @brief Metodo que establece la velocidad de este misil en base a los demas datos.
	 * @param velocidad
	 */
	public void setVelocidadCalculada(int velocidad){
		velocidadCalculada=velocidad;
	}
	
	
	/**
	 * @brief Metodo que devuelve la primera marca de tiempo.
	 * @return marca de tiempo 1.
	 */
	public int getMarcaTiempo1(){
		return marcaTiempo1;
	}
	
	/**
	 * @brief Metodo que devuelve la segunda marca de tiempo
	 * @return marca de tiempo 2
	 */
	public int getMarcaTiempo2(){
		return marcaTiempo2;
	}
	
	/**
	 * @brief Metodo que devuelve la velocidad que se calculo para este misil.
	 * @return velocidad del misil detectado.
	 */
	public int getVelocidadCalculada(){
		return velocidadCalculada;
	}
	
	/**
	 * @brief Metodo que devuelve una referencia al MisilEnemigo Detectado
	 * @return referencia al Misil enemigo detectado.
	 */
	public Misil getMisil(){
		return misilDetectado;
	}
	

	/**
	 * @brief Metodo que devuelve la primera posicion detectada de este enemigo
	 * @return primera posicion detectada correspondente a la marca de tiempo 1
	 */
	public double[] getPosicionTiempo1(){
		return posicionTiempo1;
	}
	
	/**
	 * @brief Metodo que devuelve la segunda posicion detectada de este enemigo
	 * @return segunda posicion detectada correspondente a la marca de tiempo 2
	 */
	public double[] getPosicionTiempo2(){
		return posicionTiempo2;
	}
	
	
	/**
	 * @brief Metodo que imprime informacion sobre este "detectado"
	 */
	public void printDetectado(){
		System.out.println("Detectado: "+this.getMisil().getID());
		System.out.println("Posicion1: ("+posicionTiempo1[0]+";"+posicionTiempo1[1]+";"+
		       posicionTiempo1[2]+")  Tiempo: "+marcaTiempo1);
		System.out.println("Posicion2: ("+posicionTiempo2[0]+";"+posicionTiempo2[1]+";"+
			       posicionTiempo2[2]+")  Tiempo: "+marcaTiempo2);
	}

	/**
	 * @brief Metodo que calcula la velocidad de un misil enemigo detectado basandose en 
	 * 		  dos posiciones obtenidas y una marca de tiempo.
	 */
	public void calcularVelocidad(){
		double moduloP1=Math.sqrt(posicionTiempo1[0]*posicionTiempo1[0]+posicionTiempo1[1]*posicionTiempo1[1]+
				posicionTiempo1[2]*posicionTiempo1[2]);
		double moduloP2=Math.sqrt(posicionTiempo2[0]*posicionTiempo2[0]+posicionTiempo2[1]*posicionTiempo2[1]+
				posicionTiempo2[2]*posicionTiempo2[2]);
		
		velocidadCalculada=(int)Math.abs((moduloP2-moduloP1)/(marcaTiempo2-marcaTiempo1));
		//System.out.println("Modulo/tiempo (1/2)  "+moduloP1+"/"+marcaTiempo1+"  "+moduloP2+"/"+marcaTiempo2);
		//System.out.println("VelocidadCalculada "+velocidadCalculada);
		
	}
	
}